'''
爬取丁香园的疫情的数据
author：wyj
'''
import json
import re
import requests
import datetime

'''
datetime库参考：https://www.cnblogs.com/awakenedy/articles/9182036.html
data类： 日期对象,常用的属性有year, month, day
today(...)：返回当前日期
strftime('%Y%m%d')：日期的输出格式20200404
'''
today = datetime.date.today().strftime('%Y%m%d')  # 20200404
# print(today)

def crawl_dxy_data():
    '''
    爬取丁香园实时统计数据，保存在date目录下面，
    以当前日期_x作为文件名，存JSON文件
    x:chinaData中国疫情数据
    x:globalData全球疫情数据
    x:hubeiData湖北疫情数据
    :return: None
    '''
    # 因为这个网站的数据使用js渲染的，所以通过静态代码无法获取数据,获取到的都是json格式的数据
    response = requests.get("https://ncov.dxy.cn/ncovh5/view/pneumonia") # request.get()用于请求目标网站
    print(response.status_code)  # 打印状态码

    try:
        url_text = response.content.decode()  # 二进制数据进行解码
        # print(url_text)
        # 获取全球各个地区的数据
        crawl_global_data(url_text)
        # 获取全国疫情数据
        crawl_china_data(url_text)


    except Exception as e:
        print(e)
        print('<Response [%s]>' % response.status_code)


def crawl_global_data(url_text):
    '''
    爬取全球疫情数据
    :param url_text: 全球的疫情数据
    :return:
    '''
    # 在Python的正则表达式中，有一个参数为re.S。它表示 “.” 的作用扩展到整个字符串，包括“\n”
    url_global_content = re.search(r'window.getListByCountryTypeService2true = (.*?)}]}catch', url_text, re.S)
    global_texts = url_global_content.group()  # 获取匹配正则表达式的整体结果
    global_content = global_texts.replace('window.getListByCountryTypeService2true = ', '').replace('}catch')  # 去除多余的字符
    '''
    关于json：https://blog.csdn.net/anthony_1223/article/details/82259286  或者OneNote->python->爬虫->数据存储-json文件处理
    json.loads()是将json格式的字符串转为字典类型。
    json.dumps()是将python中的字典类型转为字符串类型;
    文件编码以及json编码问题
    ensure_ascii=False,这样就不允许自动转换成unicode编码的字符
    '''
    json_data_global = json.loads(global_content)
    with open('data/' + today + '_globalData.json', 'w', encoding='utf-8') as f:
        json.dump(json_data_global, f, ensure_ascii=False)


def crawl_china_data(url_text):
    '''
    爬取全国的疫情数据
    :param url_text: 全球的疫情数据
    :return:
    '''
    # re.search():扫描字符串以查找正则表达式模式产生匹配项的第一个位置 ，然后返回相应的match对象。
    # 在字符串a中，包含换行符\n，在这种情况下：如果不使用re.S参数，则只在每一行内进行匹配，如果一行没有，就换下一行重新开始;
    # 而使用re.S参数以后，正则表达式会将这个字符串作为一个整体，在整体中进行匹配。
    url_content = re.search(r'window.getAreaStat = (.*?)}]}catch', url_text, re.S)
    texts = url_content.group()  # 获取匹配正则表达式的整体结果
    content = texts.replace('window.getAreaStat = ', '').replace('}catch', '')  # 去除多余的字符
    json_data = json.loads(content)
    with open('data/' + today + '_chinaData.json', 'w', encoding='UTF-8') as f:
        json.dump(json_data, f, ensure_ascii=False)


def crawl_province_data():
    '''
    获取各个省份疫情详情数据，包括每日新增的人数等
    :return:
    '''
    # 20200404_chinaData.json
    with open('data/' + today + '_chinaData.json', 'r', encoding='utf-8') as file:
        json_array = json.loads(file.read())
    statistics_data = {}

    for province in json_array:
        response = requests.get(province['statisticsData'])
        try:
            # 给字典的key赋值
            # 就是给每个省份赋相应的数据值
            statistics_data[province['provinceShortName']] = json.loads(response.content.decode())['data']

        except Exception as e:
            print(e)
            print('<Response [%s]> for url: [%s]' % (response.status_code, province['statisticsData']))

    with open("data/statistics_data.json", 'w', encoding='utf-8') as f:
        json.dump(statistics_data, f, ensure_ascii=False)


if __name__ == '__main__':
    # crawl_dxy_data()
    crawl_province_data()